package com.xyht.sca_s.student_manage_system.modules.visitor.service.impl;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xyht.sca_s.student_manage_system.auth.util.JwtTokenUtil;
import com.xyht.sca_s.student_manage_system.common.commonReturn.CommonCodeEnum;
import com.xyht.sca_s.student_manage_system.common.commonReturn.CommonResult;
import com.xyht.sca_s.student_manage_system.common.commonReturn.ExceptionCast;
import com.xyht.sca_s.student_manage_system.common.commonReturn.ResponseResult;
import com.xyht.sca_s.student_manage_system.common.util.TimeUtil;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.SmsVisitorUser;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.dto.SmsVisitorUserDTO;
import com.xyht.sca_s.student_manage_system.modules.visitor.entity.vo.SmsVisitorUserVO;
import com.xyht.sca_s.student_manage_system.modules.visitor.mapper.SmsVisitorUserMapper;
import com.xyht.sca_s.student_manage_system.modules.visitor.service.SmsVisitorUserService;
import com.xyht.sca_s.student_manage_system.modules.wx.util.WeChatUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

import static com.xyht.sca_s.student_manage_system.common.util.ParamCheckUtil.isNullOrEmpty;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author XYHT
 * @since 2023-04-16
 */
@Service
public class SmsVisitorUserServiceImpl extends ServiceImpl<SmsVisitorUserMapper, SmsVisitorUser> implements SmsVisitorUserService {
    @Autowired
    SmsVisitorUserMapper smsVisitorUserMapper;
    @Autowired
    private WxMaService wxMaService;
    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    @Autowired
    private WeChatUtil weChatUtil;

    @Override
    public ResponseResult smsVisitorUserAdd(SmsVisitorUserVO smsVisitorUserVO) {
        if (isNullOrEmpty(smsVisitorUserVO.getVisitorCode())
        ) {
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }
        WxMaJscode2SessionResult sessionResult = null;
        SmsVisitorUserDTO smsVisitorUserDTO = new SmsVisitorUserDTO();
        try {
            sessionResult = weChatUtil.getSessionKey(wxMaService, smsVisitorUserVO.getVisitorCode());
            String openId = sessionResult.getOpenid();
            String sessionKey = sessionResult.getSessionKey();
            QueryWrapper<SmsVisitorUser> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().eq(SmsVisitorUser::getVisitorOpenId, openId);
            SmsVisitorUser smsVisitorUser1 = smsVisitorUserMapper.selectOne(queryWrapper);
            if (isNullOrEmpty(smsVisitorUser1) || isNullOrEmpty(smsVisitorUser1.getId())) {
                smsVisitorUserDTO.setIsRegister(false);
            } else {
                BeanUtils.copyProperties(smsVisitorUser1, smsVisitorUserDTO);
                smsVisitorUserDTO.setIsRegister(true);
                String token = jwtTokenUtil.generateToken(smsVisitorUser1.getId());
                smsVisitorUserDTO.setToken(token);

            }
            smsVisitorUserDTO.setSessionKey(sessionKey);
        } catch (Exception e) {
            e.printStackTrace();
            return CommonResult.failed(CommonCodeEnum.FAIL);
        }

        return CommonResult.success(smsVisitorUserDTO);
    }

    @Override
    public ResponseResult deleteSmsVisitorUser(SmsVisitorUserVO smsVisitorUserVO) {
        if (isNullOrEmpty(smsVisitorUserVO.getId())) {
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }
        SmsVisitorUser queryResult = smsVisitorUserMapper.selectById(smsVisitorUserVO.getId());
        if (queryResult == null) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        smsVisitorUserMapper.deleteById(smsVisitorUserVO.getId());
        return CommonResult.success();
    }

    @Override
    public ResponseResult selectSmsVisitorUser(String search_str, Integer pageSize, Integer pageNum, String bg_date, String end_date) {
        Date bgDate = null;
        Date endDate = null;
        if (!isNullOrEmpty(bg_date)) {
            bgDate = TimeUtil.StringtoDate(bg_date);
        }
        if (!isNullOrEmpty(end_date)) {
            endDate = TimeUtil.StringtoDate(end_date);
        }
        QueryWrapper<SmsVisitorUser> queryWrapper = new QueryWrapper<>();
        if (isNullOrEmpty(queryWrapper)) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        if (bgDate != null) {
            queryWrapper.lambda().ge(SmsVisitorUser::getCreateTime, bgDate);
        }
        if (endDate != null) {
            queryWrapper.lambda().le(SmsVisitorUser::getCreateTime, endDate);
        }
        if (!isNullOrEmpty(search_str)) {
            queryWrapper.lambda().like(SmsVisitorUser::getVisitorName, search_str);
        }
        List<SmsVisitorUser> list1 = smsVisitorUserMapper.selectList(queryWrapper);
        if (list1.size() == 0) {
            return null;
        }
        queryWrapper.orderByDesc("create_time");
        Page<SmsVisitorUser> page = new Page<>(pageNum, pageSize);

        smsVisitorUserMapper.selectPage(page, queryWrapper);
        List<SmsVisitorUser> list = page.getRecords();
        int total = (int) page.getTotal();
        return CommonResult.success(list, total);
    }

    @Override
    public ResponseResult updateSmsVisitorUser(SmsVisitorUserVO smsVisitorUserVO) {
        if (isNullOrEmpty(smsVisitorUserVO)) {
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }
        SmsVisitorUser queryResult = smsVisitorUserMapper.selectById(smsVisitorUserVO);
        if (queryResult == null) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }
        SmsVisitorUser smsVisitorUser = new SmsVisitorUser();
        BeanUtils.copyProperties(smsVisitorUserVO, smsVisitorUser);
        smsVisitorUserMapper.updateById(smsVisitorUser);
        return CommonResult.success();
    }

    @Override
    public ResponseResult selectSmsVisitorUserById(String id) {
        if (isNullOrEmpty(id)) {
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }
        SmsVisitorUser smsVisitorUser = smsVisitorUserMapper.selectById(id);
        if (smsVisitorUser == null || smsVisitorUser.getId() == null) {
            return CommonResult.failed(CommonCodeEnum.DATA_NOT_FOUND);
        }

        return CommonResult.success(smsVisitorUser);

    }

    @Transactional
    @Override
    public ResponseResult smsVisitorUserRegister(SmsVisitorUserVO smsVisitorUserVO) {
        if (isNullOrEmpty(smsVisitorUserVO.getSessionKey()) || isNullOrEmpty(smsVisitorUserVO.getIv()) ||
                isNullOrEmpty(smsVisitorUserVO.getEncryptedData()) || isNullOrEmpty(smsVisitorUserVO.getVisitorCode()) ||
                isNullOrEmpty(smsVisitorUserVO.getVisitorHeadPortrait()) || isNullOrEmpty(smsVisitorUserVO.getVisitorName())) {
            return CommonResult.failed(CommonCodeEnum.INVALID_PARAM);
        }


        WxMaJscode2SessionResult sessionResult = null;
        SmsVisitorUserDTO smsVisitorUserDTO = new SmsVisitorUserDTO();
        try {
            sessionResult = weChatUtil.getSessionKey(wxMaService, smsVisitorUserVO.getVisitorCode());
            String openId = sessionResult.getOpenid();
            QueryWrapper<SmsVisitorUser> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().eq(SmsVisitorUser::getVisitorOpenId, openId);
            SmsVisitorUser smsVisitorUser1 = smsVisitorUserMapper.selectOne(queryWrapper);
            if (!isNullOrEmpty(smsVisitorUser1)) {
                return CommonResult.failed(CommonCodeEnum.USER_ACCOUNT_EXIST);
            }

            WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxMaService.getUserService().getPhoneNoInfo(smsVisitorUserVO.getSessionKey(), smsVisitorUserVO.getEncryptedData(), smsVisitorUserVO.getIv());
            if (wxMaPhoneNumberInfo.getPurePhoneNumber().equals("")) {
                return CommonResult.failed(CommonCodeEnum.WX_PHONE_NUMBER_FAIL);
            }
            String phoneNumber = wxMaPhoneNumberInfo.getPurePhoneNumber();


            SmsVisitorUser smsVisitorUser = new SmsVisitorUser();
            smsVisitorUser.setVisitorName(smsVisitorUserVO.getVisitorName());
            smsVisitorUser.setVisitorPhone(phoneNumber);
            smsVisitorUser.setVisitorOpenId(openId);
            smsVisitorUser.setVisitorHeadPortrait(smsVisitorUserVO.getVisitorHeadPortrait());
            smsVisitorUserMapper.insert(smsVisitorUser);
            BeanUtils.copyProperties(smsVisitorUser, smsVisitorUserDTO);
            String token = jwtTokenUtil.generateToken(smsVisitorUser.getId());
            smsVisitorUserDTO.setToken(token);
        } catch (Exception e) {
            e.printStackTrace();
            ExceptionCast.cast(CommonResult.failed(CommonCodeEnum.FAIL));
        }
        return CommonResult.success(smsVisitorUserDTO);
    }
}
